package com.liwenfeng.huangputi;

import java.util.*;

/*
 * 某企业有100名员工，工号依次是1-100。现公司举办年会，有一个发红包环节，要求：
 *     共发200个红包，其中小红包[1-30]元占80%，大红包[31-100]元，占20%。
 * 系统模拟产生200个红包
 * 模拟100个员工抢红包，输出哪个员工抢到哪个红包的过程，活动结束给出提示；
 * 对100名员工按红包金额降序排序，输出到控制台
 *
 * 单线程方法实现
 * */
public class HongBaoYuGame {
    HashMap<Integer, List<Integer>> map = new HashMap<>();
    int[] smallPacket = new int[160];
    int[] bigPacket = new int[40];
    Random random = new Random();

    {
        //生成160个小红包，40个大红包，初始化员工列表
        for (int i = 0; i < 160; i++) {
            smallPacket[i] = random.nextInt(1, 31);
            if (i < 40) {
                bigPacket[i] = random.nextInt(31, 101);
            }
            if (i < 100) {
                map.put(i + 1, new ArrayList<Integer>());
            }
        }
    }

    public void redWars(int[] packet) {
        for (int j : packet) {
            int getPacket = random.nextInt(1, 101);
            map.get(getPacket).add(j);
            System.out.println(getPacket+" 号员工抢到红包："+j+" 元。");
        }
        System.out.println("红包抢完了...");
    }

    public static void main(String[] args) {

        HongBaoYuGame hongBaoYuGame = new HongBaoYuGame();
        System.out.println("小红包：---------------");
        System.out.println(Arrays.toString(hongBaoYuGame.smallPacket) + Arrays.stream(hongBaoYuGame.smallPacket).sum());

        System.out.println("大红包：----------------");
        System.out.println(Arrays.toString(hongBaoYuGame.bigPacket) + Arrays.stream(hongBaoYuGame.bigPacket).sum());
        System.out.println("模拟抢红包的结果：----------------");
        hongBaoYuGame.redWars(hongBaoYuGame.smallPacket);
        hongBaoYuGame.redWars(hongBaoYuGame.bigPacket);
        System.out.println(hongBaoYuGame.map);

        System.out.println("按红包总金额降序排列：-----------------");
        hongBaoYuGame.map.entrySet().stream()
                .map(item -> Map.entry(item.getKey(), item.getValue().stream().reduce(0, Integer::sum)))
                .sorted((o1, o2) -> o2.getValue() - o1.getValue())
                .forEach(System.out::println);

    }

}
